﻿/*
 * DC jQuery Vertical Accordion Menu - jQuery vertical accordion menu plugin
 * Copyright (c) 2011 Design Chemical
 *
 * Dual licensed under the MIT and GPL licenses:
 * 	http://www.opensource.org/licenses/mit-license.php
 * 	http://www.gnu.org/licenses/gpl.html
 *
 */

(function ($) {

    $.fn.dcAccordion = function (options) {

        //set default options 
        var defaults = {
            classParent: 'dcjq-parent',
            classActive: 'active',
            classArrow: 'dcjq-icon',
            classCount: 'dcjq-count',
            classExpand: 'dcjq-current-parent',
            eventType: 'click',
            hoverDelay: 300,
            menuClose: true,
            autoClose: true,
            autoExpand: false,
            speed: 'slow',
            saveState: true,
            disableLink: true,
            showCount: false,
            //			cookie	: 'dcjq-accordion'
        };

        //call in the default otions
        var options = $.extend(defaults, options);

        this.each(function (options) {

            var obj = this;
            setUpAccordion();
            //			if(defaults.saveState == true){
            //				checkCookie(defaults.cookie, obj);
            //			}
            if (defaults.autoExpand == true) {
                $('li.' + defaults.classExpand + ' > a').addClass(defaults.classActive);
            }
            resetAccordion();

            if (defaults.eventType == 'hover') {

                var config = {
                    sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
                    interval: defaults.hoverDelay, // number = milliseconds for onMouseOver polling interval
                    over: linkOver, // function = onMouseOver callback (REQUIRED)
                    timeout: defaults.hoverDelay, // number = milliseconds delay before onMouseOut
                    out: linkOut // function = onMouseOut callback (REQUIRED)
                };

                $('li a', obj).hoverIntent(config);
                var configMenu = {
                    sensitivity: 2, // number = sensitivity threshold (must be 1 or higher)
                    interval: 1000, // number = milliseconds for onMouseOver polling interval
                    over: menuOver, // function = onMouseOver callback (REQUIRED)
                    timeout: 1000, // number = milliseconds delay before onMouseOut
                    out: menuOut // function = onMouseOut callback (REQUIRED)
                };

                $(obj).hoverIntent(configMenu);

                // Disable parent links
                if (defaults.disableLink == true) {

                    $('li a', obj).click(function (e) {
                        if ($(this).siblings('ul').length > 0) {
                            e.preventDefault();
                        }
                    });
                }

            } else {

                $('li a', obj).click(function (e) {

                    $activeLi = $(this).parent('li');
                    $parentsLi = $activeLi.parents('li');
                    $parentsUl = $activeLi.parents('ul');

                    // Prevent browsing to link if has child links
                    if (defaults.disableLink == true) {
                        if ($(this).siblings('ul').length > 0) {
                            e.preventDefault();
                        }
                    }

                    // Auto close sibling menus
                    if (defaults.autoClose == true) {
                        autoCloseAccordion($parentsLi, $parentsUl);
                    }

                    if ($('> ul', $activeLi).is(':visible')) {
                        $('ul', $activeLi).slideUp(defaults.speed);
                        $('a', $activeLi).removeClass(defaults.classActive);
                    } else {
                        $(this).siblings('ul').slideToggle(defaults.speed);
                        $('> a', $activeLi).addClass(defaults.classActive);
                    }

                    //					// Write cookie if save state is on
                    //					if(defaults.saveState == true){
                    //						createCookie(defaults.cookie, obj);
                    //					}
                });
            }

            // Set up accordion
            function setUpAccordion() {

                $arrow = '<span class="' + defaults.classArrow + '"></span>';
                var classParentLi = defaults.classParent + '-li';
                $('> ul', obj).show();
                $('li', obj).each(function () {
                    if ($('> ul', this).length > 0) {
                        $(this).addClass(classParentLi);
                        $('> a', this).addClass(defaults.classParent).append($arrow);
                    }
                });
                $('> ul', obj).hide();
                if (defaults.showCount == true) {
                    $('li.' + classParentLi, obj).each(function () {
                        if (defaults.disableLink == true) {
                            var getCount = parseInt($('ul a:not(.' + defaults.classParent + ')', this).length);
                        } else {
                            var getCount = parseInt($('ul a', this).length);
                        }
                        $('> a', this).append(' <span class="' + defaults.classCount + '">' + getCount + '</span>');
                    });
                }
            }

            function linkOver() {

                $activeLi = $(this).parent('li');
                $parentsLi = $activeLi.parents('li');
                $parentsUl = $activeLi.parents('ul');

                // Auto close sibling menus
                if (defaults.autoClose == true) {
                    autoCloseAccordion($parentsLi, $parentsUl);

                }

                if ($('> ul', $activeLi).is(':visible')) {
                    $('ul', $activeLi).slideUp(defaults.speed);
                    $('a', $activeLi).removeClass(defaults.classActive);
                } else {
                    $(this).siblings('ul').slideToggle(defaults.speed);
                    $('> a', $activeLi).addClass(defaults.classActive);
                }

                // Write cookie if save state is on
                if (defaults.saveState == true) {
                    createCookie(defaults.cookie, obj);
                }
            }

            function linkOut() {
            }

            function menuOver() {
            }

            function menuOut() {

                if (defaults.menuClose == true) {
                    $('ul', obj).slideUp(defaults.speed);
                    // Reset active links
                    $('a', obj).removeClass(defaults.classActive);
                    createCookie(defaults.cookie, obj);
                }
            }

            // Auto-Close Open Menu Items
            function autoCloseAccordion($parentsLi, $parentsUl) {
                $('ul', obj).not($parentsUl).slideUp(defaults.speed);
                // Reset active links
                $('a', obj).removeClass(defaults.classActive);
                $('> a', $parentsLi).addClass(defaults.classActive);
            }
            // Reset accordion using active links
            function resetAccordion() {
                $('ul', obj).hide();
                $allActiveLi = $('a.' + defaults.classActive, obj);
                $allActiveLi.siblings('ul').show();
            }
        });

        // Retrieve cookie value and set active items
        //		function checkCookie(cookieId, obj){
        //			var cookieVal = $.cookie(cookieId);
        //			if(cookieVal != null){
        //				// create array from cookie string
        //				var activeArray = cookieVal.split(',');
        //				$.each(activeArray, function(index,value){
        //					var $cookieLi = $('li:eq('+value+')',obj);
        //					$('> a',$cookieLi).addClass(defaults.classActive);
        //					var $parentsLi = $cookieLi.parents('li');
        //					$('> a',$parentsLi).addClass(defaults.classActive);
        //				});
        //			}
        //		}

        // Write cookie
        //		function createCookie(cookieId, obj){
        //			var activeIndex = [];
        //			// Create array of active items index value
        //			$('li a.'+defaults.classActive,obj).each(function(i){
        //				var $arrayItem = $(this).parent('li');
        //				var itemIndex = $('li',obj).index($arrayItem);
        //					activeIndex.push(itemIndex);
        //				});
        //			// Store in cookie
        //			$.cookie(cookieId, activeIndex, { path: '/' });
        //		}
    };
})(jQuery);